
package sessionBeans;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import xml.RespuestaXML;
import dtos.ItemPedido;
import dtos.ModuloDTO;
import dtos.SolicitudDTO;
import entities.Articulo;
import entities.ItemSolicitud;
import entities.Modulo;
import dtos.SolicitudDTO;
import entities.Articulo;
import entities.EstadoSolicitud;
import entities.EstadoSolicitudValor;
import entities.OrdenDespacho;
import entities.Solicitud;
import exceptions.EntityAlreadyExistException;

/**
 * Session Bean implementation class AdministradorSolicitudBean
 */
@Stateless
@LocalBean
public class AdministradorSolicitudBean implements AdministradorSolicitud {

	@PersistenceContext(unitName="CRM")
	private EntityManager em;
	
	@EJB
	private AdministradorModulo admMod;

	@EJB
	private AdministrarArticulo admArt;

	public AdministradorSolicitudBean() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public void CargarSolicitud(Solicitud solicitud)
			throws EntityAlreadyExistException {
		// TODO Auto-generated method stub
		Solicitud solic = this.buscarSolicitud(solicitud.getId());
		
		if(solic != null){
			throw new EntityAlreadyExistException("Solicitud:" + solic.getId());
		}
		
		try {
			
			em.persist(solicitud);
		} catch (Exception e) {
//			logger.error("Error creando articulo nuevo");
			e.printStackTrace();
		}		
	}

	@Override
	public List<Solicitud> GetAllSolicitudes() {
		// TODO Auto-generated method stub
		Query q = em.createQuery("from Solicitud");
		List<Solicitud> listaSol = (ArrayList<Solicitud>) q.getResultList();
		return listaSol;
	}

	@Override
	public Solicitud buscarSolicitud(int codigo) {
		// TODO Auto-generated method stub
		Query q = em.createQuery("from Solicitud a where a.id = :codigo");
		q.setParameter("codigo", codigo);
		Solicitud sol = null;
		List<Solicitud> solic = (ArrayList<Solicitud>) q.getResultList();
		if(!solic.isEmpty())
		 sol = solic.get(0);
		return sol;
	}

	@Override
	public void CambiarEstadoSolicitud(Solicitud sol) {
		// TODO Auto-generated method stub
		this.em.merge(sol);
	}


	@Override
	public List<Solicitud> agruparSolicitudesPorDeposito(List<ItemPedido> pedidos) throws EntityAlreadyExistException{
		// Obtengo depositos
		List<Modulo> listaDeposito = admMod.buscarTipoModulos("Deposito");
		//creo una solicitud por deposito
		List<Solicitud> listaSolicitud = new ArrayList<Solicitud>();
		for (Modulo aux: listaDeposito){
			Solicitud sol = new  Solicitud();
			sol.setDeposito(aux);
			sol.inicializar();
			listaSolicitud.add(sol);
		}
		//agrego los item a cada solicitud. separando por deposito
		for (ItemPedido ped: pedidos){
			 Articulo art = admArt.buscarArticulo(ped.getCodigo());
			 if (art == null){
				 throw new EntityAlreadyExistException("ARTICULO - El articulo no existe");
			 }
			 
			 for (Solicitud aux: listaSolicitud){
				 if (art.getModulo().getId() == aux.getDeposito().getId()){
					 ItemSolicitud item = new ItemSolicitud();
					 item.setArticulo(art);
					 item.setCantidad(ped.getCantidad());
					 aux.addItem(item);
				 }
			 }
		}
		//elimito alguna solicitud si no tiene articulos asociados.
		List<Solicitud> listaSolicitudesAEnviar = new ArrayList<Solicitud>();
		for (Solicitud aux: listaSolicitud){
			 if (aux.getItems().size() != 0){
				 listaSolicitudesAEnviar.add(aux);
			 }
		 }
		
		return listaSolicitudesAEnviar;
	}

	@Override
	public List<Solicitud> GetAllSolicitudesPendientes() {
		// TODO Auto-generated method stub
		String pendiente = EstadoSolicitudValor.NUEVA.toString();
		Query q = em.createQuery("select s from Solicitud s inner join s.estados se where se.nombre = :pendiente");
		q.setParameter("pendiente", pendiente);
		List<Solicitud> listaSol = (ArrayList<Solicitud>) q.getResultList();
		return listaSol;
	}
	
	public List<SolicitudDTO> GetAllSolicitudesPendientesDTO() {
		// TODO Auto-generated method stub
		String pendiente = EstadoSolicitudValor.NUEVA.toString();
		Query q = em.createQuery("select s from Solicitud s inner join s.estados se where se.nombre = :pendiente");
		q.setParameter("pendiente", pendiente);
		List<Solicitud> listaSol = (ArrayList<Solicitud>) q.getResultList();
		List<SolicitudDTO> dtos = new ArrayList<SolicitudDTO>();
		for(Solicitud s : listaSol){
			SolicitudDTO ss = new SolicitudDTO();
			ss = ss.parseDTO(s);
			dtos.add(ss);
		}
		return dtos;
	}

	@Override
	public RespuestaXML recibirSolicitudesCompletas(String jsonData) {
		// TODO Auto-generated method stub
		//idSolicitud / idModulo
		return null;
	}

	@Override
	public Solicitud buscarSolicitudAConfirmar(int codigo) {
		// TODO Auto-generated method stub
		String pendiente = EstadoSolicitudValor.NUEVA.toString();
		Query q = em.createQuery("select s from Solicitud s inner join s.estados se where se.nombre = :pendiente and s.id = :codigo");
		q.setParameter("codigo", codigo);
		q.setParameter("pendiente", pendiente);
		Solicitud sol = null;
		List<Solicitud> solic = (ArrayList<Solicitud>) q.getResultList();
		if(!solic.isEmpty())
		{
			List<EstadoSolicitud> estados = solic.get(0).getEstados();
			EstadoSolicitud actual = estados.get(estados.size() - 1);
			if(actual.getNombre().equals(EstadoSolicitudValor.NUEVA.toString()))
			{
				sol = solic.get(0);
			}
		}
			
		return sol;
	}

	@Override
	public List<SolicitudDTO> getSolicitudesPorEstado(int i) {
		// TODO Auto-generated method stub
		String pendiente = EstadoSolicitudValor.CONFIRMADA.toString();
		Query q = em.createQuery("select s from Solicitud s inner join s.estados se where se.nombre = :pendiente");
		q.setParameter("pendiente", pendiente);
		List<Solicitud> listaSol = (ArrayList<Solicitud>) q.getResultList();
		List<SolicitudDTO> dtos = new ArrayList<SolicitudDTO>();
		for(Solicitud s : listaSol){
			SolicitudDTO ss = new SolicitudDTO();
			ss = ss.parseDTO(s);
			dtos.add(ss);
		}
		return dtos;
	}

}
